package HJwt

import (
	"fmt"
	"github.com/golang-jwt/jwt/v4"
)

type Token struct {
	// 请求令牌
	AccessToken string
	// 请求令牌过期时间
	AccessTime int64
	// 刷新令牌
	RefreshToken string
	// 刷新令牌过期时间
	RefreshTime int64
	// jti唯一标识
	Jti string

	accessClaims  jwt.MapClaims
	refreshClaims jwt.MapClaims
}

func (t *Token) GetAccessClaims() jwt.MapClaims {
	t.ParseAccessClaims()
	return t.accessClaims
}

func (t *Token) ParseAccessClaims() {
	if len(t.accessClaims) > 0 {
		return
	}
	t.accessClaims = make(jwt.MapClaims, 5)
	token, _, err := jwt.NewParser().ParseUnverified(t.AccessToken, t.accessClaims)
	if err != nil {
		fmt.Printf("解析jwt失败: %s\n", err.Error())
		return
	}
	if _, ok := token.Claims.(jwt.MapClaims); ok {
		t.accessClaims = token.Claims.(jwt.MapClaims)
	}
}

func (t *Token) GetAccessKeyVal(k string) interface{} {
	t.ParseAccessClaims()
	if v, ok := t.accessClaims[k]; ok {
		return v
	}
	return nil
}

func (t *Token) GetRefreshKeyVal(k string) interface{} {
	t.ParseRefreshClaims()
	if v, ok := t.refreshClaims[k]; ok {
		return v
	}
	return nil
}

func (t *Token) GetRefreshClaims() jwt.MapClaims {
	t.ParseRefreshClaims()
	return t.refreshClaims
}

func (t *Token) ParseRefreshClaims() {
	if len(t.refreshClaims) > 0 {
		return
	}
	t.refreshClaims = make(jwt.MapClaims, 5)
	token, _, err := jwt.NewParser().ParseUnverified(t.RefreshToken, t.refreshClaims)
	if err != nil {
		fmt.Printf("解析jwt失败: %s\n", err.Error())
		return
	}
	if _, ok := token.Claims.(jwt.MapClaims); ok {
		t.refreshClaims = token.Claims.(jwt.MapClaims)
	}
}

func (t *Token) CheckJti() bool {
	jti := t.GetAccessKeyVal("jti")
	jti01 := t.GetRefreshKeyVal("jti")
	if jti == nil || jti01 == nil {
		return false
	}
	s := jti.(string)
	s2 := jti01.(string)
	return s == s2
}

func (t *Token) GetCustomClaims() jwt.MapClaims {
	m := make(jwt.MapClaims, 5)

	claims := t.GetAccessClaims()

	if len(claims) > 0 {
		for s, v := range claims {
			if s == "exp" || s == "nbf" || s == "iat" || s == "jti" {
				continue
			}
			m[s] = v
		}
	}
	return m
}
